/*
    在定义函数或者是类的时候，如果遇到类型不明确的时候就可以使用泛型
*/

function fun<T>(a: T): T {
  return a;
}

// 可以直接调用具有泛型的函数
fun(10); //不指定泛型，ts会自动进行类型推断
fun<string>("hello"); //指定泛型

// 泛型可以同时指定多个
function fun2<T, K>(a: T, b: K): T {
  console.log(b);
  return a;
}

interface Inter {
  length: number;
}

// T extends Inter 表示泛型T必须是Inter的实现类或者子类
function fun3<T extends Inter>(a: T): number {
  return a.length;
}

class TestInter implements Inter {
  constructor(public length: number) {}
}

fun3<Inter>({ length: 10 });
fun3<TestInter>(new TestInter(10));


class MyClass<T>{
    constructor(
        public name:T,
    ){};
}
const mc = new MyClass<string>('swk');
